package br.edu.catolica.sadbc.manager;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.persistence.Query;

import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.framework.EntityQuery;

import br.edu.catolica.sadbc.core.exception.BusinessObjectException;
import br.edu.catolica.sadbc.core.exception.ValidateBusinessRulesException;
import br.edu.catolica.sadbc.core.manager.AbstractCrudManager;
import br.edu.catolica.sadbc.entity.Docente;
import br.edu.catolica.sadbc.entity.Usuario;
import br.edu.catolica.sadbc.entity.enums.SimNao;
import br.edu.catolica.sadbc.entity.enums.SituacaoUsuario;
import br.edu.catolica.sadbc.entity.enums.TipoUsuario;
import br.edu.catolica.sadbc.entity.filter.DocenteSearchFilter;

@AutoCreate
@Name(value = "docenteManager")
public class DocenteManager extends AbstractCrudManager<Docente> {
	
	private static final String ejbql = "select o from Docente o";
	private static final String operator = "or";
	private String[] restriction = {
			" lower(o.nome) like concat(lower(#{docenteSearchFilter.nomeDocente}), '%') ",
			" lower(o.cpf) like concat(lower(#{docenteSearchFilter.cpfDocente}), '%') "};
	
	@Override
	public String salvar(Docente docente) throws ValidateBusinessRulesException, BusinessObjectException {
		doValidateBussinessRules(docente);
		doPreInsert(docente);
		return super.salvar(docente);
	}

	private void doPreInsert(Docente docente) {
		if (docente.getUsuario().getTipoUsuario().equals(TipoUsuario.COORDENADOR.getValue())) {
			docente.setCoordenador(SimNao.SIM.getValue());
		}
		docente.getUsuario().setStatus(SituacaoUsuario.AGUARDANDO.getValue());
		docente.getUsuario().setSenha(encrypt(docente.getUsuario().getSenha(), docente.getUsuario().getNomeUsuario()));
	}
	
	@SuppressWarnings("unchecked")
	private void doValidateBussinessRules(Docente docente) throws ValidateBusinessRulesException {
		if (!docente.getUsuario().getSenha().equalsIgnoreCase(docente.getUsuario().getConfirmaSenha())) {
			throw new ValidateBusinessRulesException("Senhas digitadas não conferem.");
		}
		
		List<Usuario> usuarioResponse = new ArrayList<Usuario>();
		Query q = this.entityManager.createQuery("select u from Usuario u where upper(u.nomeUsuario) = upper(:nomeusuario)");
		q.setParameter("nomeusuario", docente.getUsuario().getNomeUsuario());
		usuarioResponse = (List<Usuario>) q.getResultList();
		if (usuarioResponse != null && !usuarioResponse.isEmpty()) {
			throw new ValidateBusinessRulesException("Nome de usuário já existente.");
		}
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public List<Docente> pesquisarDocente(DocenteSearchFilter docenteFilter) {
		List<Docente> lista = new ArrayList<Docente>();
		EntityQuery entityQuery = new EntityQuery();
		entityQuery.setEjbql(ejbql);
		entityQuery.setRestrictionExpressionStrings(Arrays.asList(restriction));
		entityQuery.setRestrictionLogicOperator(operator);
		lista = entityQuery.getResultList();
		log.info("Lista vazia: " + lista.isEmpty());
		log.info("Tamanho da lista: " + lista.size());
		return lista;
	}
	
}
